﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OWLServer.owl.tipos;
using OWLServer.owl.etiquetas;
using System.Xml.Linq;

namespace OWLServer.owl.utilidades
{
    /// <summary>
    /// Clase que contiene métodos para manejar los espacios de nombres de una ontología.
    /// </summary>
    class UtilidadesEspaciosNombres
    {
        /// <summary>
        /// Indica si el diccionario de espacios de nombres contiene el espacio de nombres de OWL
        /// </summary>
        /// <param name="ontologia">Diccionario de espacios de nombres a consultar</param>
        /// <returns>Si contiene o no el espacio de nombres de OWL</returns>
        public static bool contieneOWL(IDictionary<string, EspacioNombres> diccionario)
        {
            return diccionario.ContainsKey(EtiquetasOWL.NOMBRE);
        }

        /// <summary>
        /// Indica si la ontología contiene el espacio de nombres de RDF
        /// </summary>
        /// <param name="ontologia">Ontología a consultar</param>
        /// <returns>Si contiene o no el espacio de nombres de RDF</returns>
        public static bool contieneRDF(IDictionary<string, EspacioNombres> diccionario)
        {
            return diccionario.ContainsKey(EtiquetasRDF.NOMBRE);
        }

        /// <summary>
        /// Indica si la ontología contiene el espacio de nombres de RDFS
        /// </summary>
        /// <param name="ontologia">Ontología a consultar</param>
        /// <returns>Si contiene o no el espacio de nombres de OWL</returns>
        public static bool contieneRDFS(IDictionary<string, EspacioNombres> diccionario)
        {
            return diccionario.ContainsKey(EtiquetasRDFS.NOMBRE);
        }

        /// <summary>
        /// Indica si la ontología contiene el espacio de nombres de XSD
        /// </summary>
        /// <param name="ontologia">Ontología a consultar</param>
        /// <returns>Si contiene o no el espacio de nombres de XSD</returns>
        public static bool contieneXSD(IDictionary<string, EspacioNombres> diccionario)
        {
            return diccionario.ContainsKey(EtiquetasXSD.NOMBRE);
        }

        /// <summary>
        /// Extrae las nombres de expacio que contienen el OWL
        /// </summary>
        /// <param name="root">Raiz del documento OWL</param>
        /// <returns>Nombres de espacios del OWL</returns>
        public static IList<EspacioNombres> getNombresEspacio(XElement root)
        {
            IList<EspacioNombres> nombres = null;

            nombres = root.Attributes().
                Where(a => a.IsNamespaceDeclaration).
                GroupBy(a => a.Name.Namespace == XNamespace.None ? String.Empty : a.Name.LocalName,
                a => XNamespace.Get(a.Value)).ToList().ConvertAll(g => new EspacioNombres(g.Key, g.First().NamespaceName));

            return nombres;
        }

        /// <summary>
        /// Obtiene un elemento XNamespace a partir de un EspacioNombres
        /// </summary>
        /// <param name="espacio">Espacio de nombres</param>
        /// <returns>Elemento XNamespace</returns>
        public static XNamespace getEspacioNombres(EspacioNombres espacio)
        {
            return XNamespace.Get(espacio.Uri);
        }
    }
}
